from MovementType import *

class cVisualEntity(object):

    """
     Entidad visual principal encargada de la gestion de los objetos en el juego. Un
     objeto visual tiene una representacion grafica (texture) un cuerpo fisico
     (phisical_body) con el que interactuar con otros elementos y una forma fisica
     (phisical_shape) con la informacion necesaria para interactuar con otros
     elementos.
     
     Ademas, una entidad visual puede tener su propio sistema de IA a traves del
     gestor de cerebros (brain_manager).
     
     Durante la actualizacion y el renderizado de las entidades, se aplican los
     diferentes efectos disponibles en el gestor de efectos (effect_manager).
     
     Ademas, una entidad visual puede actuar como padre de otras entidades visuales
     (childs) de forma que la informacion de esta este disponible para todos sus
     hijos.

    :version:
    :author:
    """

    """ ATTRIBUTES

     Id asignado a la entidad.

    id  (public)

     Indica si la entidad esta activa. Si no esta activa, la entidad no interactua
     con el mundo fisico.

    active  (public)

     Indica si la entidad debe ser destruida y eliminada de la lista de entidades del
     objeto padre.

    destroy  (public)

     Clase de objecto de esta entidad. Se utiliza como clasificacion de la entidad
     fuera del motor.

    objec_class  (public)

     Subclase de objeto de esta entidad. Se utiliza como clasificacion de la entidad
     fuera del motor.

    object_subclass  (public)

     Gestor de efectos. Se encarga de modificar las propiedades de la entidad a
     través de los diferentes efectos que esta puede tener asociada.

    effect_manager  (public)

     Gestor de cerebros. Se encarga de modificar las propiedades de la entidad de
     acuerdo al estado actual de la entidad con relacion al resto de entidades. Este
     es el gestor de IA.

    brain_manager  (public)

     Referencia a la capa a la que pertenece esta entidad.

    layer  (public)

     Referencia a la entidad padre a la que pertenece la entidad actual. Esta
     propiedad y la propiedad layer son mutamente excluyentes.

    parent  (public)

     Nombre asignado a esta entidad.

    name  (public)

     Objeto que representa la textura de esta entidad. Esta textura es la que se
     dibujara en pantalla en representacion de la entidad.

    texture  (public)

     Vec2d. Tupla que contiene la direccion en la que se aplica la fuerza para
     desplazar la entidad. En reposo (0.0,0.0), hacia la derecha (1.0,0.0) en
     diagonal derecha-arriba (0.7,0.7), etc. Esta tupla se encuentra normalizada. Se
     aplica cuando el tipo de movimiento es MOVE_DIRECTION.

    direction  (public)

     Vec2d. Tupla que contiene la posicion en el espacio al que se dirige esta
     entidad. Se aplica cuando el tipo de movimiento es MOVE_DESTINATION.

    destination  (public)

     Indica el tipo de movimiento que realiza esta entidad. Con un movimiento de tipo
     MOVE_DIRECTION la fuerza se aplica en la direccion indicada en la propiedad
     "direction". Con un movimiento de tipo MOVE_DESTINATION, la fuerza se aplica en
     la direccion calculada y normalizada (POS_DESTINO - POS_ACTUAL). Con el tipo de
     movimiento MOVE_NONE, la entidad no realiza ningun movimiento (no recibe ninguna
     fuerza) pero sigue interactuando con el resto de las entidades existentes.

    movement_type  (public)

     Fuerza que se aplica a la entidad cuando su tipo de movimiento "movement_type"
     es diferente de MOVE_NONE.

    force  (public)

     Objecto fisico (pymunk.body) que contiene toda la informacion de la existencia
     de la entidad (masa, velocidad, momento, etc...) de forma que se puedan calcular
     las interacciones entre esta entidad y el resto de las entidades existentes.

    phisical_body  (public)

     Forma fisica asignada a la entidad (pymunk.shape) que permite calcular las
     colisiones e interacciones con el resto de las entidades existentes.

    phisical_shape  (public)

     Diccionario de entidades hijas asociadas a esta entidad. Estas entidades se
     comportan de forma normal, con la diferencia de que en vez de tener una
     referencia a la capa padre en la que se encuentran, tienen una referencia a la
     entidad a la que pertenecen. Generalmente este diccionario se reserva para
     entidades intimamente relacionadas con la entidad actual.

    childs  (public)

    """

    def __init__(self, name, layer, parent, object_class, object_subclass):
        """
         Inicia la instancia de esta clase, asignando un nombre a la entidad, asi como la
         capa a la que pertenece y la clase y sub_clase a las que pertenece. Durante esta
         inicializacion tambien se añade la entidad a la lista de entidades disponibles
         en la capa/entidad a la que pertenece.

        @param string name : Nombre asignado a la entidad.
        @param cLayer layer : Capa a la que pertenece la entidad. Puede ser nula. en ese caso el parametro parent debe contener una referencia a la entidad que hara de padre de esta.
        @param cVisualEntity parent : Referencia a la entidad padre a la que pertenece esta entidad. Puede ser nulo. En ese caso el parametro layer debe contener una referencia a la capa a la que pertenecera esta nueva entidad.
        @param int object_class : Clase en la que se clasificara esta entidad.
        @param int object_subclass : Subclase dentro de la clase en la que se clasificara esta entidad.
        @return  :
        @author
        """
        pass

    def update(self, self, elapsed, keyboard, mouse):
        """
         Metodo encargado de la actualizacion de la entidad. Durante la actualizacion, se
         aplican los efectos que esten asignados a esta entidad a través de la propiedad
         "effect_library".

        @param cVisualEntity self : 
        @param float elapsed : Tiempo en segundos transcurrido desde la ultima actualizacion.
        @param cKeyboard keyboard : Instancia del teclado con el estado actual de todas las teclas.
        @param cMouse mouse : Instancia del raton con el estado actual de los botones, la rueda y la posicion del raton en el mundo.
        @return  :
        @author
        """
        pass

    def render(self, self):
        """
         Si tiene textura, la pinta en pantalla, teniendo en cuenta la posicion,
         rotacion, escala y transparencia de la misma. En determinadas entidades, la
         textura puede ser transparente y realizarse el dibujado de forma manual. Esto
         sucede sobre todo en entidades cuya representacion grafica depende en gran
         medida de los datos actualizados de la entidad padre a la que pertenece.

        @param cVisualEntity self : 
        @return  :
        @author
        """
        pass

    def add_entity(self, self, entity):
        """
         Añade una entidad a la lista de entidades de la entidad actual. Devuelve el
         codigo asignado a la entidad.

        @param cVisualEntity self : 
        @param cVisualEntity entity : Instancia de la entidad que se desea añadir.
        @return int :
        @author
        """
        pass

    def get_entity(self, self, entity_id):
        """
         Obtiene una entidad determinada basandose en el codigo de la entidad.

        @param cVisualEntity self : 
        @param int entity_id : Id de la entidad que se desea obtener.
        @return cVisualEntity :
        @author
        """
        pass

    def remove_entity(self, self, entity_id):
        """
         Retira una entidad de la lista de entidades disponibles en esta entidad.

        @param cVisualEntity self : 
        @param int entity_id : Id de la entidad que se desea retirar.
        @return  :
        @author
        """
        pass



